package com.nerve.android.cloudoffice.domain.db;

import java.io.Serializable;
import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * @项目名称 :CellNote
 * @文件名称 :Entity.java
 * @所在包 :org.nerve.cellnote.storage
 * @功能描述 :
 *	是一个范型抽象类，模拟 JPA 形式，封装数据库的常用操作，子类必须实现如下方法以达到数据绑定：<br />
 *		public abstract String getDBName();	//绑定的表名  <br />
 *		public abstract String getCreateSQL();	//表的构造sql语句，在建表时使用  <br />
 *		public abstract String[] getColumns();	//表列	<br />
 *		public abstract T bind(Cursor c);	//实体的数据注入	<br />
 *	<br />
 * @创建者 :集成显卡	1053214511@qq.com
 * @创建日期 :2013-1-21
 * @修改记录 :
 */
public abstract class Entity<T extends Serializable> {
	protected Context context;
	protected SQLiteDatabase DB;
	
	public Entity(Context c){
		context = c;
	}
	
	/**
	 * @方法名称 :getDBName
	 * @功能描述 :对应的表名
	 * @return
	 * @return :String
	 */
	public abstract String getDBName();
	
	/**
	 * @方法名称 :getCreateSQL
	 * @功能描述 :创建表的SQL
	 * @return
	 * @return :String
	 */
	public abstract String getCreateSQL();
	
	/**
	 * @方法名称 :getColumns
	 * @功能描述 :得到字段
	 * @return
	 * @return :String[]
	 */
	public abstract String[] getColumns();
	
	/**
	 * @方法名称 :bind
	 * @功能描述 :传入一个Cursor，绑定到实体中
	 * @param c
	 * @return :void
	 */
	public abstract T bind(Cursor c);
	
	public SQLiteDatabase getDB(){
		if(DB == null)
			DB = new DBManager(context).getDB();
		
		return DB;
	}
	
	public T getById(int id){
		Cursor c = query("_id="+id, null, null, null, null);
		if(c.moveToFirst())
			return bind(c);
		else
			return null;
	}
	
	/**
	 * @方法名称 :getBy
	 * @功能描述 :
	 * 
	 *	@param column 查询的字段
	 *	@param value	值
	 *	@return
	 */
	public T getBy(String column, String value){
		Cursor c = query(column+"=?", new String[]{value}, null, null, null);
		if(c.moveToFirst() == false)
			return null;
		return bind(c);
	}
	
	/**
	 * @方法名称 :getAll
	 * @功能描述 :返回所有记录
	 * 
	 *	@return
	 */
	public ArrayList<T> getAll(){
		Cursor c = query(null, null, null, null, getDefaultOrderBy());
		ArrayList<T> result = new ArrayList<T>();
		
		while(c.moveToNext()){
			T temp = bind(c);
			result.add(temp);
		}
		
		c.close();
		return result;
	}
	
	/**
	 * @方法名称 :getList
	 * @功能描述 :根据条件得到数据列表
	 * 
	 *	@param column	匹配的字段
	 *	@param value	字段值
	 *	@param orderBY	排序方式
	 *	@return
	 */
	public ArrayList<T> getList(String column, String values, String orderBY){
		Cursor c = query(column+"=?", new String[]{values}, null, null, orderBY);
		ArrayList<T> result = new ArrayList<T>();
		
		while(c.moveToNext()){
			T temp = bind(c);
			result.add(temp);
		}
		
		c.close();
		return result;
	}
	
	public ArrayList<T> getListLike(String where, String[] values, String orderBY){
		Cursor c = query(where, values, null, null, orderBY);
		
		return buildToList(c);
	}
	
	/**
	 * @method name: getList
	 * @description: 获取列表
	 * @return type: ArrayList<T>
	 *
	 * @param where
	 * @param argsW
	 * @param groupBy
	 * @param having
	 * @param orderBy
	 * @return
	 */
	public ArrayList<T> getList(String where, String[] argsW, String groupBy, String having, String orderBy){
		Cursor c = query(where, argsW, groupBy, having, orderBy);
		return buildToList(c);
	}
	
	public ArrayList<T> buildToList(Cursor c){
		ArrayList<T> result = new ArrayList<T>();
		
		while(c.moveToNext()){
			T temp = bind(c);
			result.add(temp);
		}
		
		c.close();
		return result;
	}
	
	/**
	 * @方法名称 :query
	 * @功能描述 :得到一个游标，数据表名和字段都是使用默认的
	 * @param where
	 * @param argsW
	 * @param groupBy
	 * @param having
	 * @param orderBy
	 * @return
	 * @return :Cursor
	 */
	public Cursor query(String where, String[] argsW, String groupBy, String having, String orderBy){
		return getDB().query(getDBName(), getColumns(), where, argsW, groupBy, having, orderBy);
	}
	
	public Cursor query(String tableName, String[] columns, String where, 
			String[] argsW, String groupBy, String having, String orderBy){
		return getDB().query(tableName, columns, where, argsW, groupBy, having, orderBy);
	}
	
	/**
	 * @方法名称 :getDefaultOrderBy
	 * @功能描述 :得到默认的排序方式。如果子类有特别要求，重写这个方法
	 * @return
	 * @return :String
	 */
	public String getDefaultOrderBy(){
		return null;
	}
	
	/**
	 * @方法名称 :insert
	 * @功能描述 :
	 * @param cv
	 * @return 返回新增数据行的id，如果出错返回-1
	 * @return :long
	 */
	public long insert(ContentValues cv){
		return getDB().insert(getDBName(), null, cv);
	}
	
	public int update(ContentValues cv, String where, String[] whereArgs){
		return getDB().update(getDBName(), cv, where, whereArgs);
	}
	
	/**
	 * @方法名称 :delById
	 * @功能描述 :根据id删除数据行，返回的是删除的行数
	 * 
	 *	@param id
	 *	@return
	 */
	public int delById(int id){
		return getDB().delete(getDBName(), "_id="+id, null);
	}
	
	/**
	 * @方法名称 :delBy
	 * @功能描述 :根据条件删除数据行，返回的是删除的行数
	 * 
	 *	@param column
	 *	@param value
	 *	@return
	 */
	public int delBy(String column, String value){
		return getDB().delete(getDBName(), column+"=?", new String[]{value});
	}
}